clc
clear all;
%bancailingjian12=cell(1,5)
%bancailingjian11=cell(1,4)
%bancailingjian3=cell(1,8)
%bancailingjian2=cell(1,8)
%bancailingjian1=cell(1,8)
%bancailingjian4=cell(1,8)
%bancailingjian5=cell(1,8) 
%bancailingjian6.mat(83.97)
%bancailingjian6=cell(1,8)
%bancailingjian7=cell(1,8)
%bancailingjian8=cell(1,8)
%bancailingjian9=cell(1,8)
%bancailingjian10=cell(1,34)
N=100;     %种群规模(取偶数)
load Nomal_s.mat
%load Setup_time_11.mat
%load Setdown_time1.mat
%load Due_date1.mat
%load bancailingjian1.mat
load  bancailingjian10.mat
load Machine1.mat%这里改了有几个板材就多少
load Speed1.mat
V=[150  200  250];%V=[120  150 180]
job_no=7;
A=cell(300,5)
 %  for in=1:20
    %  tic;
    LENGTHPlate=Nomal_s;%板材的切割长度
    Machine_single=Machine1;  %%机器选择情况
    m_no=size(LENGTHPlate,2); %钢板数量
    M=100     %20*m_no;      %遗传进化迭代次数
    temp1=1:m_no;
    temp2=Machine_single(:,1:3)';
    CUTMachineDis=[temp1;temp2];
    %Setup=Setup_time_11;   %%板材的准备时间
    %Setdown=Setdown_time1;  %%板材的收拾时间
  Setup=randi([1,3],1,17); %Setup=randi([1,5],1,5)
    Setdown=randi([1,3],1,17);%Setdown=randi([1,5],1,5);
   % DELIVERPlate=Due_date1;  %板材的交货期
   DELIVERPlate=  bancailingjian10;
   availableMachine=[2 1 1];% availableMachine=[1 1 1] %每种类型机器的台数
    Vcut= V;%切割机的切割速度
    n_no=m_no;                %钢板对应的机器分布（m_no==n_no）
    BestManufactureTime = zeros(3,m_no);%保存最佳时间分布以及所属的机器的第几台信息，画甘特图
    %% 随机产生初始种群
    harmony=zeros(N,m_no+n_no);  %储存种群
    for k=1:N
   cutSeqence=randperm(m_no);  %随机生成板材切割序列
    %cutSeqence=[8 1 5 6 4 2 3 7];
    machine=zeros(1,n_no);
     
    %分配切割机器
    for i=1:m_no;
        index=find(cutSeqence(i)==CUTMachineDis(1,:));    %%找出对应的工件
        machineAvailable=CUTMachineDis(2:end,index); %%找出对应工件的适用的机器代号
        temp=ceil((size(CUTMachineDis,1)-1)*rand);  %%随机选择一台机器
        machine(i) = CUTMachineDis(temp+1,index);  %%对使用的机器进行赋值
       % while(machine(i)==0);                   %%如果选择的机器不能被使用  也就是0，则循环重新选择
        %   temp=ceil((size(CUTMachineDis,1)-1)*rand);
         % machine(i) = CUTMachineDis(temp+1,index);
       % end
    end
        harmony(k,:)=[cutSeqence machine];
  end
    %% 多目标函数值评价
        n=100;     
        Aut_no=30;%外部记忆库，存储精英解
        mubiao=2;%目标个数
        long=size(harmony,2);
        Out_Memory=zeros(1,long+mubiao+2);%外部记忆库，存放方案long染色体长度、目标值2个目标值、等级（数值）、拥挤距离（数值）
        make_fit=[];
        tardi_fit=[];
        %%  评价初始种群
for k=1:N
    chrome=harmony(k,:);
     [makespan,tardiness,setime,manufacturetime] = ManufactureCost(chrome,m_no,DELIVERPlate,availableMachine,Vcut,LENGTHPlate,Setup,Setdown);    
     make_fit(k,:)=makespan;%(最大完工时间)
     tardi_fit(k,:)=tardiness;%（总拖延/延迟成本）
end    
%% 进行非支配排序(找出个体属于哪个等级)，计算拥挤距离
Classy=zeros(n,1);       %%种群规模数量n
x0=[harmony make_fit tardi_fit Classy];   %%染色体 2个目标  分类级别
f = non_domination_sort_mod(x0, mubiao, long);   %%  没有重复染色体的染色体数组，目标个数，染色体长度
f_temp=f(:,1:(size(f,2)-4)); 

%% 迭代
X1_no=find(f(:,long+mubiao+1)==1);%取出第一级所有个体,X1中包括拥挤距离值，即增加了一列
X1=f(X1_no,:);
X0=unique(X1,'rows'); %筛选，踢出相同个体、非支配个体、拥挤距离小的个体，保证外部记忆库规模
Out_Memory_temp_num=size(X0,1);  
counter=0; %设置迭代计数器
Select_no=100; %选择的个数
while counter<M  %停止条件为达到最大迭代次数
    expectation_muta=[];
%% 选择
    harmony=f_temp;
%% 交叉
    CrossChromes=Crossoperation(harmony,Select_no,m_no,n_no,CUTMachineDis);
    
%% 变异
    [MutationChrome,Mutation_no]=Mutation(CrossChromes,Select_no,m_no,n_no,CUTMachineDis,Out_Memory_temp_num);
    
    %用新产生的子代更新原种群，形成新一代种群
x13=[harmony;CrossChromes;MutationChrome];
x12=unique(x13,'rows');
if size(x12,1)<Select_no;
    temp=Select_no-size(x12,1);
    harmony=zeros(temp,m_no+n_no);  %储存种群
make_fit=[]; %储存种群内每个切割方案的适应度值
tardi_fit=[]; %储存种群内每个切割方案的适应度值
f5=[];
for k=1:temp;
    cutSeqence=randperm(m_no);
    machine=zeros(1,n_no);
    %分配切割机器
    for i=1:m_no;
        index=find(cutSeqence(i)==CUTMachineDis(1,:));    %%找出对应的工件
        machineAvailable=CUTMachineDis(2:end,index); %%找出对应工件的适用的机器 代号
        temp=ceil((size(CUTMachineDis,1)-1)*rand);  %%随机选择一台机器
        machine(i) = CUTMachineDis(temp+1,index);  %%对使用的机器进行赋值
        while(machine(i)==0);                     %%如果选择的机器不能被使用  也就是0，则循环重新选择
            temp=ceil((size(CUTMachineDis,1)-1)*rand);
            machine(i) = CUTMachineDis(temp+1,index);
        end
    end
    f5(k,:)=[cutSeqence machine];
end
x12=[x12;f5];
%kB=size(x12,1);
% expectation_muta=cell(kB,4);
end
    for k=1:size(x12,1);
        
        chrome=x12(k,:);
        [makespan,tardiness,setime,manufacturetime] = ManufactureCost(chrome,m_no,DELIVERPlate,availableMachine,Vcut,LENGTHPlate,Setup,Setdown);
         expectation_muta(k,2)=tardiness;
         expectation_muta(k,1)=makespan;
        A(k,:)={chrome,makespan,tardiness,setime,manufacturetime};
   % expectation_muta(k,:)={makespan,tardiness,setime,manufacturetime}
    
    end       
%% 合并种群选出新种群
Classy=zeros(size(x12,1),1);
% B12=size(x12,1);
% x2=cell(B12,19)
x2=[x12 expectation_muta Classy];%新种群
%合并两个种群   染色体数量由x1+x2
f1= non_domination_sort_mod(x2, mubiao, long);   %%非占优排序

%% 找出满足select_no 数量的最大序数
f2=sortrows(f1,[(size(f1,2)-1) -size(f1,2)]);
f_100=f2(1:100,:);

%% 取出第一级所有个体,X1中包括拥挤距离值，即增加了一列
X1_no=find(f_100(:,long+mubiao+1)==1);%取出第一级所有个体,X1中包括拥挤距离值，即增加了一列
X1=f_100(X1_no,:);
X0=unique(X1,'rows'); %筛选，踢出相同个体、非支配个体、拥挤距离小的个体，保证外部记忆库规模
X2=sortrows(X0,[(size(X0,2)-1) -size(X0,2)]);
Out_Memory_temp_num=size(X2,1);  
if Out_Memory_temp_num>Aut_no;
    Out_Memory=X2(1:Aut_no,:); 
else
    Out_Memory=X2;
end

f_temp=f_100(:,1:size(f_100,2)-4);
% f_temp(size(Out_Memory,1)+1:size(f,1),1:size(Out_Memory_1,2)-2)=f(size(Out_Memory,1)+1:size(f,1),1:size(f,2)-4);
counter=counter+1;  
end   
%Memory_ii=Out_Memory
Memory_ii=Out_Memory(:,1:size(Out_Memory,2));

%  end
save Memory_ii Memory_ii


   




